package Game
{
	import Collision.MyObj;
	
	import Menu.MenuPage;
	import Menu.PageEvent;
	
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.Loader;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.filters.BitmapFilterQuality;
	import flash.filters.BlurFilter;
	import flash.text.TextField;
	import flash.ui.Keyboard;
	import flash.utils.Timer;
	import flash.utils.getTimer;
	
	[SWF(width="800",height="600",frameRate="50")]
	
	public final class GameMain2 extends Sprite
	{
		private var stack:Vector.<Enemy>;
		
		private var container:Sprite;//контейнер кирпичей
		private var mous:Boolean=false;//индикатор нажатой кнопки мыши
		private var space:Boolean=false,blur:Boolean=false;
		private var effects:Sprite;//слой эффектов
		
		private var herohit:MyObj;//физичне столкновения для коровки
		public var line:Shape;
		private var jet:jetpack_go;
		public var boom:Babax;
		private var bonus:Sprite;
		private var bonustaken:int=0;
		private var blurfiltr:BlurFilter;
		private var hero:Bird;//сам главный объект-божья коровка. им управляет игрок
		private var fon:FonGrace;
		private var timer:Timer;
		public var idealX:Number; // значения заданы функциями, стемящимися к значениям координат курсора
		public var idealY:Number; // всё это нужно для менее багнутой функции плавного поворота объекта
		private var time:Number;//фиксирует время прохождения уровня
		private var txt:TextField;
		private var generated:Boolean=false; //сгенерировано ли препятствие на данном отрезке пути?
		private var freq:Number=300; //длина пути, на котором нет препятствий, корректно робит при >= 50
		public function GameMain2()
		{
			super();
			ControlModul.restart();
			txt=new TextField();
			fon=new FonGrace(new grace());
			hero=new Bird();
			blurfiltr=new BlurFilter();
			container=new Sprite;
			effects=new Sprite;
			bonus=new Sprite();
			stack=new Vector.<Enemy>();
			line=new  Shape;
			jet=new jetpack_go;
			if (stage){//ждем добавления на экран всего содержимого
				init()
			}else{
				addEventListener(Event.ADDED_TO_STAGE,init);
				addEventListener(Event.REMOVED_FROM_STAGE,remove);
			}
		}
		private function init(e:Event=null):void{
			removeEventListener(Event.ADDED_TO_STAGE,init);
			addChild(fon);
			addChild(txt);
			txt.x=700;
			txt.y=500;
			
			addChild(container);
			addChild(bonus);
			hero.x=stage.stageWidth/2;
			ControlModul.heroY=stage.stageHeight-hero.height;
			hero.y=ControlModul.heroY;
			addChild(hero);
			herohit=new MyObj(hero);
			herohit.rotation;
			addChild(effects);
			addChild(line);
			idealX = mouseX;
			idealY = mouseY;
			
			
			time=getTimer();//сохраняем времяя начала игры
			stage.addEventListener(MouseEvent.MOUSE_UP,move);
			addEventListener(Event.ENTER_FRAME,play);
			stage.addEventListener(MouseEvent.MOUSE_DOWN,stop);
			stage.addEventListener(KeyboardEvent.KEY_DOWN,push);
			stage.addEventListener(KeyboardEvent.KEY_UP,pop);
		}
		private function push(e:KeyboardEvent):void{
			
			switch(e.keyCode)
			{
				case Keyboard.Z:
				{
					space=true;
					break;
				}
				case Keyboard.X:{

					blur=true;
					break;
				}
				default:
				{
					break;
				}
			}
			
		}
		private function pop(e:KeyboardEvent):void{
			switch(e.keyCode)
			{
				case Keyboard.Z:
				{
					space=false;
					break;
				}
				case Keyboard.X:
				{
					blur=false;
					break;
				}
						
				default:
				{
					break;
				}
			}
		}
		private function createEnemy():void{//функция добавления врагов
			for (var i:int=0;i<(1+Math.floor(Math.random()*3));i++){ //добавляем от 1 до 4 кирпичей за раз
				var veroyatnost:int=Math.random()*100;
				if (veroyatnost>5) {
					var block:Enemy=new Enemy();
					var cposx = block.x;
					block.x=Math.floor(Math.random()*stage.stageWidth);
					if (Math.abs(block.x-cposx)<block.width) block.x += (block.width*1.5);
					container.addChild(block);
				} else {
					var bonjet:jetpack=new jetpack();
					bonjet.x=Math.floor(Math.random()*stage.stageWidth);
					bonus.addChild(bonjet);
				}
			}
		}
		private function play(e:Event):void{//функция оживляет игру
			/*
			line.graphics.clear();
			line.graphics.lineStyle(1);
			line.graphics.moveTo(herohit.p1.x,herohit.p1.y);
			line.graphics.lineTo(herohit.p2.x,herohit.p2.y);
			line.graphics.lineTo(herohit.p4.x,herohit.p4.y);
			line.graphics.lineTo(herohit.p3.x,herohit.p3.y);
			line.graphics.lineTo(herohit.p1.x,herohit.p1.y);
			*/
			//какбы это странно не звучало НО куча for работает быстрее и без багов чем один for с качей if в каждом
			//Проверено. инфа 100%
			txt.text=container.numChildren.toString()+"   "+ControlModul.speed.toString()+"\n"+ControlModul.distance+"\n"+ bonustaken;
			
			if (bonustaken>20){
				jet.x=hero.x;
				jet.y=hero.y;
				jet.rotation=hero.rotation+90;
				jet.scaleX=jet.scaleY=0.75;
				
				
				ControlModul.maxSpeed=60;
				ControlModul._speed=ControlModul.maxSpeed;
				bonustaken--;
				blurfiltr.blurX=0;
				blurfiltr.blurY=ControlModul.speed;
				blurfiltr.quality=BitmapFilterQuality.LOW;
				container.filters=[blurfiltr];
				blurfiltr.blurY=ControlModul.speed/3;
				effects.filters=[blurfiltr];
			}else if(bonustaken>0){
				container.filters=null;
				effects.filters=null;
				jet.y+=9;
				jet.rotation+=5;
				bonustaken--;
			}
			if (bonustaken==1) {
				removeChild(jet);
				ControlModul.maxSpeed=20;
			}
			trace(bonustaken);
			//<генерация препятствия>
			if(ControlModul.distance%freq <= 50) { // если дошли до зоны, где будет сгенерировано препятствие
				if (!generated) {	// и оно ещё не сгенерировано, делаем это
					createEnemy();
					generated=true;
				}	
			} else { // пока идём до следующей зоны генерации, выставляем флаг на false
				generated = false;
			}
			//</генерация препятствия>
			
			var i:int,j:int,cur:Enemy,curobj:MyObj,bon:Sprite;
			fon.move(ControlModul.speed);
			for (i=0;i<container.numChildren;++i){				
				cur=container.getChildAt(i) as Enemy;				
				cur.y+=ControlModul.speed-cur.Yspeed;
				cur.x+=cur.Xspeed*ControlModul.rubb;
				
			}
			
			for (i=0;i<bonus.numChildren;++i){				
				bon=bonus.getChildAt(i) as Sprite;				
				bon.y+=ControlModul.speed;
			}
			
			if(space){
				for (i=0;i<container.numChildren;++i){
					cur=container.getChildAt(i) as Enemy;
					if((cur.x-hero.x)*(cur.x-hero.x)+(cur.y-hero.y)*(cur.y-hero.y)<=(hero.height+cur.width+10)*(hero.height+cur.width+10)/4){
						cur.push();
						ControlModul._speed=0;
					}
				}
			}
			if(mous){
				ControlModul.move();							
			}else{
				ControlModul.stop();					
			}
			
			if(ControlModul.distance>=20000){
				end();
			}
			for(i=0;i<container.numChildren;++i){
				cur=container.getChildAt(i) as Enemy;
				if (herohit.hit2(new MyObj(cur))){
					
					ControlModul.heroX=hero.x;
					(container.getChildAt(i) as Enemy).imp();
					cur.x+=herohit.offset.x;
					cur.y+=herohit.offset.y;
				}
			}
			
			for (i=0;i<bonus.numChildren;++i){
				bon=bonus.getChildAt(i) as Sprite;
				if(herohit.hit2(new MyObj(bon))){
					bonustaken=100;
					addChild(jet);
					bonus.removeChild(bon);
				}
			}
			for (i=container.numChildren-1;i>=0;--i){
				cur=container.getChildAt(i) as Enemy;
				curobj=new MyObj(cur);
				for(j=0;j<i;++j){
					if(curobj.hit2(new MyObj(container.getChildAt(j) as Enemy))){
						cur.impEnemy(container.getChildAt(j)as Enemy);
//<<<<<<< .mine
						boom = new Babax();
						//if (Math.abs((cur.Xspeed-(container.getChildAt(j) as Enemy).Xspeed)) > 0) {
							boom.x=container.getChildAt(j).x;
							boom.y=container.getChildAt(j).y;
							//boom.scaleX=boom.scaleY=sub/10;
							effects.addChild(boom);
						//}
//=======
						(container.getChildAt(j)as Enemy).x+=curobj.offset.x;
						(container.getChildAt(j)as Enemy).y+=curobj.offset.y;
						
//>>>>>>> .r59
					}
				}
				
			}
			for(i=0;i<container.numChildren;++i){
				cur=container.getChildAt(i) as Enemy;
				if (cur.y>=600||cur.x>=800||cur.x<=0||cur.y<=-300){
					container.removeChildAt(i);
				}
			}
		
			moveHero();
		}
		private function speedUP():void{
			
		}
		private function end():void{
			remove();//вызываем деструктор всех слушателей
			time=getTimer()-time;//фиксируем время игры

			var req:Request=new Request("http://blan4.no-ip.org/PHP/addHigh.php");
			req.send(time/1000);
			dispatchEvent(new PageEvent(PageEvent.NEED_PAGE,MenuPage));
		}	
		private function moveHero():void{
			var currot:Number=Math.atan2(idealY-hero.y,idealX-hero.x)*180/Math.PI;
			hero.rotation=(currot>0||currot<-180)?-currot:currot;//не даем объекту ехать задом,если курсор будет ниже чем объект то он будет крутится инвертно
			ControlModul._speedX=Math.cos(hero.rotation*Math.PI/180)*ControlModul.speed;
			hero.x+=ControlModul.speedX;
			idealX += (-idealX+stage.mouseX)/10; // Благодаря этой штуке полностью исправлены глюки при работе с арктангенсом
			idealY += (-idealY+stage.mouseY)/10;
		}
		private function move(e:MouseEvent):void{
			mous=true;
		}
		private function stop(e:Event):void{
			mous=false;
		}
		private function remove(e:Event=null):void{
			removeEventListener(Event.ADDED_TO_STAGE,init);
			removeEventListener(Event.REMOVED_FROM_STAGE,remove);
			stage.removeEventListener(MouseEvent.MOUSE_UP,move);
			removeEventListener(Event.ENTER_FRAME,play);
			stage.removeEventListener(MouseEvent.MOUSE_DOWN,stop);
			removeChild(fon);
			removeChild(txt);
			removeChild(hero);
			removeChild(effects);
			removeChild(line);
			removeChild(container);
			removeChild(jet);
		}
	}
}
